昨日了解到 K3s 這個輕量級的 Kubernetes 管理 Contaienr 管理工具後,今日就來手動嘗試部署一個 K3s cluster 吧!
在部署 Cluster 之前需要先準備的環境如下:
兩台 Host (VM 或主機) , Server VM 的 RAM 至少需要 512 MB,Work Node VM 的 RAM 至少需要 75MB,並且兩台主機都已經安裝好 Docker 了。
切換到 root 使用者,並執行以下的 Command:
IPADDR=$(ip a show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f1)
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v0.9.1 INSTALL_K3S_EXEC="--docker --node-ip=${IPADDR} --flannel-iface=enp0s8 --write-kubeconfig-mode 644 --no-deploy=servicelb --no-deploy=traefik" sh -
我們會執行 https://get.k3s.io 這程式裡面的腳本,而帶入的 option 有:
INSTALL_K3S_VERSION
: 指定安裝 K3s 的版本INSTALL_K3S_EXEC
: 指定 k3s server
執行的 option
--docker
: 選用 Docker 當作 K3s 的 container 引擎。--node-ip=${IPADDR}
: 設定 Master Node 的 IP--flannel-iface=enp0s8
: 設定 flannel 溝通用的 network interface ,請記得這邊的 enp0s8
改成自己主機的 network interface。--write-kubeconfig-mode 644
: 設定 kubeconfig 的權限 mode。--no-deploy=servicelb --no-deploy=traefik
: 設定不要部署 packaged 的 components。這樣 K3s server 就安裝完了。
可以使用 systemctl status k3s
與 journalctl -u k3s
查看 K3s 的 Service 狀態。
並在進行下一步驟前,執行 echo "export NODE_TOKEN=$(sudo cat /var/lib/rancher/k3s/server/node-token)"
紀錄 Cluster Node 之間認證用的 Token。
先在 /etc/hosts
加入 master node 與 IP 的對應。
echo "$K3SMASTER_IPADDRESS $K3SMASTER_HOSTNAME" | sudo tee -a /etc/hosts
接著切換到 root 使用者後,貼上剛剛 Master Node 上取得的認證 token,如下
export NODE_TOKEN=K10571d20534c867fe6ce8d...
並執行以下的 Command 來安裝 K3s agent
export K3SMASTER_IPADDRESS=...
IPADDR=$(ip a show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f1)
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v0.9.1 INSTALL_K3S_EXEC="--docker --node-ip=${IPADDR} --flannel-iface=enp0s8" K3S_URL=https://${K3SMASTER_IPADDRESS}:6443 K3S_TOKEN=${NODE_TOKEN} sh -
在執行 https://get.k3s.io 這程式裡面的腳本中,INSTALL_K3S_EXEC
而外帶入的 option 有:
K3S_URL
: 是讓 agent 知道他要和哪個 server 連線K3S_TOKEN
: 是用來認證用的這樣 K3s agent 就安裝完了。
可以使用 systemctl status k3s-agent
查看 k3s-agent 的 Service 狀態。
如果不想要依照以上方法一步一步操作的話,也可以參考 GitHub 上的 k3s-lab repository 來嘗試快速部署起一個 K3s Cluster。本篇也將採用這個方法安裝,這種部署環境需要具備 VirtualBox 以及 Vagrant ,並且主機尚有 1.6G 的 RAM 可以使用。安裝方法如下:
$ sh deploy-vagrant.sh
export NODE_TOKEN=K10571d20534c867fe6ce8d...
的字串,將這字串複製後,透過 vageant ssh node1
進入 node 的 VM 並且執行以下的指令:$ sudo su -
$ cd /home/vagrant/
$ export NODE_TOKEN=K10571d20534c867fe6ce8d... // 是複製的字串
$ sh install-k3s-node.sh ${NODE_TOKEN}
這樣就完成以上部署 K3s Cluster 了。接下來我們來驗證 K3s Cluster 是否正常吧!
首先先進入 Master Node,你可以透過 k3s 指令看到它有支援的 commands,如下,因此我們可以直接使用 kubectl, crictl, ctr:
而因為我們使用 Docker 為我們的 container 引擎,所以本篇只用 kubectl 來和大家一起驗證。
$ k3s -h
NAME:
k3s - Kubernetes, but small and simple
USAGE:
k3s [global options] command [command options] [arguments...]
VERSION:
v0.9.1 (755bd1c6)
COMMANDS:
server Run management server
agent Run node agent
kubectl Run kubectl
crictl Run crictl
ctr Run ctr
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug Turn on debug logs
--help, -h show help
--version, -v print the version
我們可以透過 kubectl 來查看 Cluster node 資訊與 component 的狀態。
$ kubectl get no -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready master 97m v1.15.4-k3s.1 192.168.0.200 <none> Ubuntu 18.04.3 LTS 4.15.0-64-generic containerd://1.2.8-k3s.1
node1 Ready worker 93m v1.15.4-k3s.1 192.168.0.201 <none> Ubuntu 18.04.3 LTS 4.15.0-64-generic containerd://1.2.8-k3s.1
$ kubectl get componentstatus
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
也可以用 kubectl 來跑一個 deployment 來啟動一個 nginx ,如以下 Lab。
$ kubectl run mynginx --image=nginx --replicas=1 --port=80
deployment.apps/mynginx created
$ kubectl expose deployment mynginx --port 80
service/mynginx exposed
$ kubectl get deploy,po,svc -o wide -l run=mynginx
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.extensions/mynginx 1/1 1 1 115s mynginx nginx run=mynginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/mynginx-568f57494d-nsc8r 1/1 Running 0 115s 10.42.1.2 node1 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/mynginx ClusterIP 10.43.220.117 <none> 80/TCP 27s run=mynginx
$ curl 10.43.220.117
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
如上,其實使用方式和 Kubernetes 使用原本資源方法是一樣的,所以要更換 install 的工具,其實並不是太困難。
在 K3s Server 端執行
systemctl stop k3s && /usr/local/bin/k3s-uninstall.sh
;在 k3s agent 端執行
systemctl stop k3s-agent && /usr/local/bin/k3s-agent-uninstall.sh
今天嘗試手動安裝 K3s ,除了安裝方式和 Kubernetes 方法安裝不一樣之外,使用方式竟然是意外的雷同,很多相容的地方,相信在在之後 Edge 與雲端的整合上會是很良好的。很樂見這樣的一種主流,也可以驗證為何會宣稱 "Kubernetes is getting very boring"了。